﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Oracle.DataAccess.Client;
using Oracle.DataAccess.Types;
using System.Data;
using System.Windows.Controls;
using System.Globalization;
using System.Windows.Data;
using System.Windows;
using System.Reflection;
using System.Net.Mail;
using System.Configuration;
using System.Security.Cryptography;
using System.IO;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Input;
using System.ComponentModel;
using produccion.AccesoDatos;
using System.Windows.Controls.Primitives;
using System.Collections.ObjectModel;
using System.Threading;
using produccion.Conexion;
using produccion.clases;

namespace produccion.forms
{
    /// <summary>
    /// Lógica de interacción para FrmReporteNominaTerminada.xaml
    /// </summary>
    /// 

    public partial class FrmReporteNominaTerminada : Window
    {
        #region FJRF - VARIABLES GENERIAS DE TODO EL FORMULARIO
        MDOgeneral MdoGeneral = new MDOgeneral();//FJRF - Traemos toda la informacion y funciones de MdoGeneral

        DataTable DtConsulta;//FJRF - Usamos este DataTable para hacer consultas generales
        DataSet DsConsulta;//FJRF - Usamos este DataTable para hacer consultas generales
        String StrConsulta;//FJRF - Usamos este DataTable para hacer consultas generales

        DataTable DtEncabezadoYParametros;//FJRF - Usamos este DataTable para hacer consultas generales del os encabezados mas los parametros
        DataTable DtImprimir;
        DataSet DsImprimir;//FJRF - Usamos este dataset para la impresion de consultas

        DataTable DtEntregas;//FJRF - Usamos este DataTable para hacer consultas 
        DataTable DtEquipos;//FJRF - Usamos este DataTable para hacer consultas 
        DataTable DtCargarEquipos;//FJRF - Usamos este DataTable para hacer consultas 
        DataTable DtResumen;//FJRF - Usamos este DataTable para hacer consultas 

        string StrMensajeBox = "";//FJRF - Para los mensajes de las cajas de texto
        string StrCaptionBox = "";//FJRF - Para los mensajes de los caption de las cajas de texto
        String StrCodigoPrimerColorReferencia;

        //String StrRutaReporteCrystalReport = @"c:\produccion\produccion\reportes\";//FJRF - Esta es la ruta de los reportes de crystal reports
        String StrRutaReporteCrystalReport = @"reportes\";//FJRF - Esta es la ruta de los reportes de crystal reports

        private CLSSEMANAS _semana = new CLSSEMANAS { DESDE_SEM = DateTime.Today, HASTA_SEM = DateTime.Today };
        private ProcesoProduccionRepositorio _repositorio = new ProcesoProduccionRepositorio();
        #endregion

        #region FJRF - Objetos del formulario

        public FrmReporteNominaTerminada()
        {
            InitializeComponent();
        }
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            //FJRF - CON ESTO GARANTIZAMOS QUE LAS FECHAS SIEMPRE VENDRAN EN ESTE FORMATO DE DIA/MES/AÑO
            System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");//FJRF - Con esto aseguramos que la base de datos reciba los numeros como se deben recibir
            Thread.CurrentThread.CurrentCulture = (CultureInfo)Thread.CurrentThread.CurrentCulture.Clone();
            Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern = "dd/MM/yyyy";

            string strTituloVentana = "REPORTE DE NOMINA TERMINADA" + " - Usuario:" + MDOgeneral.usuario + "- [FrmReporteNominaTerminada]";//FJRF - Armamos el titulo de la ventana
            Title = strTituloVentana;//FJRF - Ponemos el titulo de la ventana

            StrConsulta = "SELECT NROENT_EMD AS ENTRADA, FECHA_EMD AS FECHA, TO_NUMBER(SUM(CANPRO_DMD),'999999') AS TOTAL, CODEQU_EMD AS EQUIPO, '' AS INTEGRANTES, '' AS EMP ";//FJRF - Seleccionamos los campos
            StrConsulta = StrConsulta + "FROM ENCMONDES, DETMONDES ";//FJRF - Las tablas con las que trabajaremos
            StrConsulta = StrConsulta + "WHERE ESTADO_EMD = 'P' ";//FJRF - Cuando el estado este pendiente
            StrConsulta = StrConsulta + "AND NROENT_EMD = NROENT_DMD ";//FJRF - Relacionamos las tablas
            StrConsulta = StrConsulta + "GROUP BY NROENT_EMD, FECHA_EMD, CODEQU_EMD ";//FJRF - Agrupamos para poder sumar el campo total
            StrConsulta = StrConsulta + "ORDER BY NROENT_EMD ";//FJRF - Ordenamos 
            
            DtEntregas = MdoGeneral.consulta(StrConsulta);//FJRF - Buscamos los datos
            DtgEntregas.ItemsSource = DtEntregas.DefaultView;//FJRF - Los asignamos los datos encontrados

            TxtNumeroSemana.Style = null;//FJRF - Le quitamos el estilo al objeto para maneja el foco

            #region FJRF - Traemos los integrantes de los equipos ya pregrabados
            #region FJRF - Variables
            String StrEquipoDigitado = "", StrIntegrantesEquipo = "";//FJRF - Variable que tendra el equipo digitado iniciandola vacia
            String StrCodigoEmpleado = "", StrNombreEmpleado = "";//FJRF - Para traer el codigo y el nombre del empleado

            int IntContadorDeLineas = 0;//FJRF - Variable para controlar el numero de lineas para poner los empleados
            int IntCantidadEmpleados = 0;//FJRF - Para saber la cantidad de empleados

            String StrEquipoBuscado = "", StrIntegrantes = "";//FJRF - Para cargar los equipor que se estan buscando en este proceso
            #endregion

            for (int IntFilaActual = 0; IntFilaActual < DtEntregas.Rows.Count; IntFilaActual++)//FJRF - Recorremos la informacion encontrada
            {
                StrEquipoBuscado = DtEntregas.Rows[IntFilaActual][3].ToString();//FJRF - Extraemos el codigo del equipo
                if (StrEquipoBuscado.Length == 5)//FJRF - Si el equipo tiene 5 caracteres y tiene integrantes (Por si han digitado un dato malo y se quedo en el grid ejemplo (12345)
                {
                    #region FJRF - Buscamos los integrantes del equipo digitado
                    StrConsulta = "SELECT CODEMP_EQU AS CODIGO, NOMEMP_EMP AS EMPLEADO ";//FJRF - Armamos la consulta
                    StrConsulta = StrConsulta + "FROM MAEEQU, MAEEMPP ";//FJRF - Armamos la consulta
                    StrConsulta = StrConsulta + "WHERE CODSEC_EQU = 'T' AND CODEQU_EQU = '" + StrEquipoBuscado + "' ";//FJRF - Armamos la consulta
                    StrConsulta = StrConsulta + "AND CODEMP_EQU = CODEMP_EMP ";//FJRF - Armamos la consulta
                    StrConsulta = StrConsulta + "ORDER BY NOMEMP_EMP ";//FJRF - Armamos la consulta
                    DtConsulta = MdoGeneral.consulta(StrConsulta);//FJRF - Traemos los datos consultados
                    #endregion

                    if (DtConsulta.Rows.Count > 0)//FJRF - Si se encontro los integrantes del equipo hacemos lo siguiente entonces hacemos lo siguiente
                    {
                        #region FJRF - Cargamos los datos del equipo seleccionado
                        StrEquipoBuscado = "";//FJRF - Limpiamos la variable
                        StrIntegrantesEquipo = "";//FJRF - Limpiamos la variable
                        IntCantidadEmpleados = 0;//FJRF - Limpiamos la variable
                        IntContadorDeLineas = 0;//FJRF - Limpiamos la variable
                        for (int IntFilaActualDt = 0; IntFilaActualDt < DtConsulta.Rows.Count; IntFilaActualDt++)//FJRF - Recorremos la informacion encontrada
                        {
                            StrCodigoEmpleado = DtConsulta.Rows[IntFilaActualDt][0].ToString();//FJRF - Extraemos el codigo del empleado
                            StrNombreEmpleado = DtConsulta.Rows[IntFilaActualDt][1].ToString();//FJRF - Extraemos el nombre del empleado

                            StrIntegrantesEquipo = StrIntegrantesEquipo + "[ " + StrNombreEmpleado + " ] ";//FJRF - Creamos una cadena de datos con los empleados

                            IntContadorDeLineas++;//FJRF - Sumamos las lineas que van
                            if (IntContadorDeLineas == 3)//FJRF - Si las lineas son iguales a 3 entonces hacemos lo siguiente
                            {
                                StrIntegrantesEquipo = StrIntegrantesEquipo + "\n";//FJRF - Generamos un salto de linea
                                IntContadorDeLineas = 0;//FJRF - Ponemos el contador de lineas en cero para empezar de nuevo
                            }
                            IntCantidadEmpleados++;//FJRF - Sumamos los empleados
                        }
                        DtEntregas.Rows[IntFilaActual][4] = StrIntegrantesEquipo;//FJRF - ponemos los empleados
                        DtEntregas.Rows[IntFilaActual][5] = IntCantidadEmpleados;//FJRF - ponemos la cantidad de empleados
                        #endregion
                    }
                    else//FJRF - Si no encontro integrantes en el equipo entonces hacemos lo siguiente
                    {
                        DtEntregas.Rows[IntFilaActual][3] = "";//FJRF - Limpiamos la celda
                        DtEntregas.Rows[IntFilaActual][4] = "";//FJRF - Limpiamos la celda
                        DtEntregas.Rows[IntFilaActual][5] = "";//FJRF - Limpiamos la celda

                        StrEquipoBuscado = "";//FJRF - Limpiamos la variable
                    }
                }
            }
            #endregion

            #region FJRF - Agrupamos las entregas para el grid de abajo lado izquierdo equipos con Linq
            var varEquiposAgrupados = from TblTmp in DtEntregas.AsEnumerable()//FJRF - Seleccionamos el datatable con el que vamos a trabajar
                                      where !string.IsNullOrEmpty(TblTmp.Field<string>("EQUIPO")) && TblTmp.Field<string>("EQUIPO").Length == 5//FJRF - Lo condicionamos diciendo que solo traiga los campos con datos y que la longitud del equipo igual a 5
                                      group TblTmp by TblTmp.Field<string>("EQUIPO") into CampoEquipo//FJRF - Agrupamos los datos
                                      orderby CampoEquipo.Key//FJRF - Ordenamos los datos
                                      let list = CampoEquipo.ToList()
                                      select new//FJRF - Armamos la nueva tabla
                                      {
                                          EQUIPO = CampoEquipo.Key,//FJRF - Ponemos el campo que se agrupo
                                          ENTREGAS = list.Count,//FJRF - Contamos el campo que se agrupo
                                          PARES = list.Sum(x => x.Field<Decimal>("TOTAL"))//FJRF - Sumamos este campo que se agrupo
                                      };
            DtEquipos = MdoGeneral.LinqRetornarDataTable(varEquiposAgrupados);//FJRF - Convertimo la lista generada en una tabla tipo DataTable con los nuevos datos
            DtgEquipos.ItemsSource = DtEquipos.DefaultView;//FJRF - La asignamos al grid
            #endregion
         }
        private void TxtNumeroSemana_TextChanged(object sender, TextChangedEventArgs e)
        {
            if (TxtNumeroSemana.Text.Trim().Length > 0)//FJRF - Si hay datos digitados hacemos lo siguiente
            {
                DateTime DttFecha = DateTime.Now;//FJRF - Cargamos una variable con la fecha actual del sistema
                String StrSemana = MdoGeneral.StrRetornarUnSoloCampo("semana_cal", "Semana", "calendp", "to_char(fecha_cal, 'YYYY') = " + DttFecha.Year + " AND semana_cal = " + TxtNumeroSemana.Text.Trim() + " GROUP BY semana_cal");//FJRF - Buscamos si la semana existe en este año
                if (StrSemana == "DATO NO ENCONTRADO")//FJRF - Si no encontramos la semana hacemos lo siguiente
                {
                    Msgbox("PROCESO CANCELADO", "La semana [ " + TxtNumeroSemana.Text.Trim() + " ] no existe en el año [ " + DttFecha.Year + " ]", MessageBoxButton.OK, MessageBoxImage.Stop);//FJRF - Informamos la usuario

                    DtpDesde.SelectedDate = null;//FJRF - Limpiamos los datos
                    DtpHasta.SelectedDate = null;//FJRF - Limpiamos los datos

                    TxtNumeroSemana.Text = ""; //FJRF - Limpiamos los datos
                }
                else//FJRF - Si la semana existe hacemos lo siguiente
                {
                    _semana.NROSEM_SEM = int.Parse(TxtNumeroSemana.Text.Trim());//FJRF - Asignamos la semana a buscar en la clase
                    _semana = _repositorio.consultar_Semana(_semana, "S");//FJRF - Buscamos la semana diciendo que solo vamos a buscar la semana

                    DtpDesde.SelectedDate = _semana.DESDE_SEM;//FJRF - Asignamos el dato retornado
                    DtpHasta.SelectedDate = _semana.HASTA_SEM;//FJRF - Asignamos el dato retornado
                }
            }
            else//FJRF - Si no hay datos hacemos lo siguiente
            {
                DtpDesde.SelectedDate = null;//FJRF - Limpiamos los datos
                DtpHasta.SelectedDate = null;//FJRF - Limpiamos los datos
            }
        }
        private void TxtNumeroSemana_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            //FJRF - VALIDACION PARA QUE SOLO ACEPTE NUMEROS (SOLO NUMEROS)
            int ascci = Convert.ToInt32(Convert.ToChar(e.Text));
            if (ascci >= 48 && ascci <= 57) e.Handled = false;
            else e.Handled = true;
        }
        private void DtgEntregas_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            #region FJRF - Variables
            String StrEquipoDigitado = "", StrIntegrantesEquipo = "";//FJRF - Variable que tendra el equipo digitado iniciandola vacia
            String StrCodigoEmpleado = "", StrNombreEmpleado = "";//FJRF - Para traer el codigo y el nombre del empleado

            int IntContadorDeLineas = 0;//FJRF - Variable para controlar el numero de lineas para poner los empleados
            int IntCantidadEmpleados = 0;//FJRF - Para saber la cantidad de empleados
            #endregion

            #region FJRF - Saber Fila y Columna indexada

            int IntColumnaIndexada, IntFilaIndexada;
            DependencyObject dep = (DependencyObject)e.OriginalSource;

            //Stepping through the visual tree
            while ((dep != null) && !(dep is System.Windows.Controls.DataGridCell))
            {
                dep = VisualTreeHelper.GetParent(dep);
            }

            //Is the dep a cell or outside the bounds of Window1?
            if (dep == null | !(dep is System.Windows.Controls.DataGridCell))
            {
                return;
            }
            else
            {
                System.Windows.Controls.DataGridCell cell = new System.Windows.Controls.DataGridCell();
                cell = (System.Windows.Controls.DataGridCell)dep;
                while ((dep != null) && !(dep is DataGridRow))
                {
                    dep = VisualTreeHelper.GetParent(dep);
                }

                if (dep == null)
                {
                    return;
                }
                int colindex = cell.Column.DisplayIndex;  //this returns COLUMN INDEX
                IntColumnaIndexada = colindex;

                DataGridRow row = dep as DataGridRow;
                System.Windows.Controls.DataGrid dataGrid = ItemsControl.ItemsControlFromItemContainer(row) as System.Windows.Controls.DataGrid;
                int rowindex = dataGrid.ItemContainerGenerator.IndexFromContainer(row); //this returns ROW INDEX

                IntFilaIndexada = rowindex;
            }
            #endregion

            #region FJRF - Limpiamos los datos 
            DtgResumen.ItemsSource = null;//FJRF - Desvinculamos el objeto
            DtResumen = null;//FJRF - Borramos los datos
            DtgResumen.Items.Clear();//FJRF - Limpiamos el grid

            DtEntregas.Rows[DtgEntregas.SelectedIndex][4] = "";//FJRF - Limpiamos los integrantes
            DtEntregas.Rows[DtgEntregas.SelectedIndex][5] = "";//FJRF - Limpiamos la cantidad de integrantes... empleados EMP
            #endregion

            #region FJRF - Buscamos los empleados del equipo y agrupamos datos

            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.Enter && elemento != null)//FJRF - Si precionan enter hacemos lo siguiente
            {
                #region FJRF - Buscamos el dato digitado
                DataGridCell cell = DataGridHelper.GetCell(DtgEntregas, DtgEntregas.SelectedIndex, 3);//FJRF - Extraemos los datos de la celda
                StrEquipoDigitado = cell.ToString().Replace("System.Windows.Controls.DataGridCell:", "").Trim();//FJRF - Traemos el equipo digitado
                if (StrEquipoDigitado.Trim() == "System.Windows.Controls.DataGridCell")//FJRF - Si viene con este parametro hacemos lo siguiente
                {
                    StrEquipoDigitado = "";//FJRF - Limpiamos la variable
                }
                #endregion

                StrConsulta = "SELECT DISTINCT CODEQU_EQU AS EQUIPO FROM MAEEQU WHERE CODSEC_EQU = 'T' AND CODEQU_EQU = '" + StrEquipoDigitado + "'";//FJRF - Armamos la consulta
                DtConsulta = MdoGeneral.consulta(StrConsulta);//FJRF - Traemos los datos consultados

                if (DtConsulta.Rows.Count > 0)//FJRF - Si se encontro el equipo entonces hacemos lo siguiente
                {
                    #region FJRF - Buscamos los integrantes del equipo digitado
                    StrConsulta = "SELECT CODEMP_EQU AS CODIGO, NOMEMP_EMP AS EMPLEADO ";//FJRF - Armamos la consulta
                    StrConsulta = StrConsulta + "FROM MAEEQU, MAEEMPP ";//FJRF - Armamos la consulta
                    StrConsulta = StrConsulta + "WHERE CODSEC_EQU = 'T' AND CODEQU_EQU = '" + StrEquipoDigitado + "' ";//FJRF - Armamos la consulta
                    StrConsulta = StrConsulta + "AND CODEMP_EQU = CODEMP_EMP ";//FJRF - Armamos la consulta
                    StrConsulta = StrConsulta + "ORDER BY NOMEMP_EMP ";//FJRF - Armamos la consulta
                    DtConsulta = MdoGeneral.consulta(StrConsulta);//FJRF - Traemos los datos consultados
                    #endregion

                    if (DtConsulta.Rows.Count > 0)//FJRF - Si se encontro los integrantes del equipo hacemos lo siguiente entonces hacemos lo siguiente
                    {
                        #region FJRF - Cargamos los datos del equipo seleccionado
                        for (int IntFilaActual = 0; IntFilaActual < DtConsulta.Rows.Count; IntFilaActual++)//FJRF - Recorremos la informacion encontrada
                        {
                            StrCodigoEmpleado = DtConsulta.Rows[IntFilaActual][0].ToString();//FJRF - Extraemos el codigo del empleado
                            StrNombreEmpleado = DtConsulta.Rows[IntFilaActual][1].ToString();//FJRF - Extraemos el nombre del empleado

                            StrIntegrantesEquipo = StrIntegrantesEquipo + "[ " + StrNombreEmpleado + " ] ";//FJRF - Creamos una cadena de datos con los empleados

                            IntContadorDeLineas++;//FJRF - Sumamos las lineas que van
                            if (IntContadorDeLineas == 3)//FJRF - Si las lineas son iguales a 3 entonces hacemos lo siguiente
                            {
                                StrIntegrantesEquipo = StrIntegrantesEquipo + "\n";//FJRF - Generamos un salto de linea
                                IntContadorDeLineas = 0;//FJRF - Ponemos el contador de lineas en cero para empezar de nuevo
                            }
                            IntCantidadEmpleados++;//FJRF - Sumamos los empleados
                        }
                        DtEntregas.Rows[DtgEntregas.SelectedIndex][3] = StrEquipoDigitado;//FJRF - asignamos el equipo ya que estamos trabajando directamente con el datatable
                        DtEntregas.Rows[DtgEntregas.SelectedIndex][4] = StrIntegrantesEquipo;//FJRF - ponemos los empleados
                        DtEntregas.Rows[DtgEntregas.SelectedIndex][5] = IntCantidadEmpleados;//FJRF - ponemos la cantidad de empleados
                        #endregion
                    }
                    else//FJRF - Si no encontro integrantes en el equipo entonces hacemos lo siguiente
                    {
                        Msgbox("PROCESO CANCELADO", "El equipo [ " + StrEquipoDigitado + " ] no tiene integrantes", MessageBoxButton.OK, MessageBoxImage.Stop);//FJRF - Informamos la usuario

                        DtEntregas.Rows[DtgEntregas.SelectedIndex][3] = "";//FJRF - Limpiamos la celda
                        DtEntregas.Rows[DtgEntregas.SelectedIndex][4] = "";//FJRF - Limpiamos la celda
                        DtEntregas.Rows[DtgEntregas.SelectedIndex][5] = "";//FJRF - Limpiamos la celda
                    }
                }
                else//FJRF - Si el equipo no existe entonces hacemos lo siguiente
                {
                    Msgbox("PROCESO CANCELADO", "El equipo [ " + StrEquipoDigitado + " ] no existe", MessageBoxButton.OK,MessageBoxImage.Stop);//FJRF - Informamos la usuario

                    DtEntregas.Rows[DtgEntregas.SelectedIndex][3] = "";//FJRF - Limpiamos la celda de los equipo digitado
                    DtEntregas.Rows[DtgEntregas.SelectedIndex][4] = "";//FJRF - Limpiamos la celda de los integrantes
                    DtEntregas.Rows[DtgEntregas.SelectedIndex][5] = "";//FJRF - Limpiamos la celda de los integrantes
                }

                #region FJRF - Quitamos los equipos que no tengan 5 caracteres
                String StrEquipoBuscado = "";//FJRF - Para cargar los equipor que se estan buscando en este proceso
                for (int IntFilaActual = 0; IntFilaActual < DtEntregas.Rows.Count; IntFilaActual++)//FJRF - Recorremos la informacion encontrada
                {
                    StrEquipoBuscado = DtEntregas.Rows[IntFilaActual][3].ToString();//FJRF - Extraemos el codigo del equipo
                    if (StrEquipoBuscado.Length != 5)//FJRF - Si el equipo tiene datos pero es menor a cinco hacemos lo siguiente
                    {
                        DtEntregas.Rows[IntFilaActual][3] = "";//FJRF - Limpiamos la celda
                        DtEntregas.Rows[IntFilaActual][4] = "";//FJRF - Limpiamos la celda
                        DtEntregas.Rows[IntFilaActual][5] = "";//FJRF - Limpiamos la celda
                    }
                }
                #endregion

                #region FJRF - Agrupamos las entregas para el grid de abajo lado izquierdo equipos con Linq
                var varEquiposAgrupados = from TblTmp in DtEntregas.AsEnumerable()//FJRF - Seleccionamos el datatable con el que vamos a trabajar
                                          where !string.IsNullOrEmpty(TblTmp.Field<string>("EQUIPO")) && TblTmp.Field<string>("EQUIPO").Length == 5//FJRF - Lo condicionamos diciendo que solo traiga los campos con datos y que la longitud del equipo igual a 5
                                          group TblTmp by TblTmp.Field<string>("EQUIPO") into CampoEquipo//FJRF - Agrupamos los datos
                                          orderby CampoEquipo.Key//FJRF - Ordenamos los datos
                                          let list = CampoEquipo.ToList()
                                          select new//FJRF - Armamos la nueva tabla
                                          {
                                              EQUIPO = CampoEquipo.Key,//FJRF - Ponemos el campo que se agrupo
                                              ENTREGAS = list.Count,//FJRF - Contamos el campo que se agrupo
                                              PARES = list.Sum(x => x.Field<Decimal>("TOTAL"))//FJRF - Sumamos este campo que se agrupo
                                          };
                DtEquipos = MdoGeneral.LinqRetornarDataTable(varEquiposAgrupados);//FJRF - Convertimo la lista generada en una tabla tipo DataTable con los nuevos datos
                DtgEquipos.ItemsSource = DtEquipos.DefaultView;//FJRF - La asignamos al grid
                #endregion
            }
            #endregion
        }
        private void DtgEquipos_KeyUp(object sender, KeyEventArgs e)
        {
            #region FJRF - Saber Fila y Columna indexada

            int IntColumnaIndexada, IntFilaIndexada;
            DependencyObject dep = (DependencyObject)e.OriginalSource;

            //Stepping through the visual tree
            while ((dep != null) && !(dep is System.Windows.Controls.DataGridCell))
            {
                dep = VisualTreeHelper.GetParent(dep);
            }

            //Is the dep a cell or outside the bounds of Window1?
            if (dep == null | !(dep is System.Windows.Controls.DataGridCell))
            {
                return;
            }
            else
            {
                System.Windows.Controls.DataGridCell cell = new System.Windows.Controls.DataGridCell();
                cell = (System.Windows.Controls.DataGridCell)dep;
                while ((dep != null) && !(dep is DataGridRow))
                {
                    dep = VisualTreeHelper.GetParent(dep);
                }

                if (dep == null)
                {
                    return;
                }
                int colindex = cell.Column.DisplayIndex;  //this returns COLUMN INDEX
                IntColumnaIndexada = colindex;

                DataGridRow row = dep as DataGridRow;
                System.Windows.Controls.DataGrid dataGrid = ItemsControl.ItemsControlFromItemContainer(row) as System.Windows.Controls.DataGrid;
                int rowindex = dataGrid.ItemContainerGenerator.IndexFromContainer(row); //this returns ROW INDEX

                IntFilaIndexada = rowindex;
            }
            #endregion

            String StrEquipoSeleccionado = "";//FJRF - Variables que se necesitan para enviarlos como parametros para buscar la imagen de la referencia

            if (DtEquipos == null)//FJRF - Si no hay datos hacemos lo siguiente
            {
                return;//FJRF - Nos salimos
            }
            else//FJRF - Si hay datos hacemos lo siguiente
            {
                StrEquipoSeleccionado = DtEquipos.Rows[IntFilaIndexada][0].ToString();//FJRF - Buscamos el dato seleccionado
                PttV_EjecutarSpYBuscarEntregas(StrEquipoSeleccionado);//FJRF - Cargamos el trecer grid
            }
        }
        private void DtgEquipos_MouseUp(object sender, MouseButtonEventArgs e)
        {
            #region FJRF - Saber Fila y Columna indexada

            int IntColumnaIndexada, IntFilaIndexada;
            DependencyObject dep = (DependencyObject)e.OriginalSource;

            //Stepping through the visual tree
            while ((dep != null) && !(dep is System.Windows.Controls.DataGridCell))
            {
                dep = VisualTreeHelper.GetParent(dep);
            }

            //Is the dep a cell or outside the bounds of Window1?
            if (dep == null | !(dep is System.Windows.Controls.DataGridCell))
            {
                return;
            }
            else
            {
                System.Windows.Controls.DataGridCell cell = new System.Windows.Controls.DataGridCell();
                cell = (System.Windows.Controls.DataGridCell)dep;
                while ((dep != null) && !(dep is DataGridRow))
                {
                    dep = VisualTreeHelper.GetParent(dep);
                }

                if (dep == null)
                {
                    return;
                }
                int colindex = cell.Column.DisplayIndex;  //this returns COLUMN INDEX
                IntColumnaIndexada = colindex;

                DataGridRow row = dep as DataGridRow;
                System.Windows.Controls.DataGrid dataGrid = ItemsControl.ItemsControlFromItemContainer(row) as System.Windows.Controls.DataGrid;
                int rowindex = dataGrid.ItemContainerGenerator.IndexFromContainer(row); //this returns ROW INDEX

                IntFilaIndexada = rowindex;
            }
            #endregion

            String StrEquipoSeleccionado = "";//FJRF - Variables que se necesitan para enviarlos como parametros para buscar la imagen de la referencia

            if (DtEquipos == null)//FJRF - Si no hay datos hacemos lo siguiente
            {
                return;//FJRF - Nos salimos
            }
            else//FJRF - Si hay datos hacemos lo siguiente
            {
                StrEquipoSeleccionado = DtEquipos.Rows[IntFilaIndexada][0].ToString();//FJRF - Buscamos el dato seleccionado
                PttV_EjecutarSpYBuscarEntregas(StrEquipoSeleccionado);//FJRF - Cargamos el trecer grid
            }
        }
 
        private void btnSalir_Click(object sender, RoutedEventArgs e)
        {
            this.Close();//FJRF - Cierra el modulo actual
        }
        private void DtgEntregas_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
            string strNombreColumna = "";//FJRF - Variable para saber el nombre de la columna
            strNombreColumna = e.Column.Header.ToString();//FJRF - Extraemos el nombre de la columna

            e.Column.IsReadOnly = true;//FJRF - Inavilita las columnas para que no se pueda escribir sobre ella
            if (strNombreColumna == "TOTAL" || strNombreColumna == "EMP")//FJRF - Si alguna de las columnas tiene este nombre hacemos lo siguiente
            {
                Style MyStyleTextAlignmentProperty = new Style(typeof(DataGridCell));//FJRF - Creamos un nuevo estilo para la celda
                MyStyleTextAlignmentProperty.Setters.Add(new Setter(TextBlock.TextAlignmentProperty, TextAlignment.Right));//FJRF - Alineamos los datos de la celda a la derecha

                (e.Column as DataGridTextColumn).Binding.StringFormat = "{0:##,#0.##}";//FJRF - Enviamos el formato a la celda
                (e.Column as DataGridTextColumn).CellStyle = MyStyleTextAlignmentProperty;//FJRF - Asignamos el estilo creado

            }
            if (e.PropertyType == typeof(System.DateTime))//FJRF - Estas son las columnas que tendran el formato de fecha
            {
                (e.Column as DataGridTextColumn).Binding.StringFormat = "dd/MM/yyyy";//FJRF - Asignamos el formato a la fecha
            }
            if (strNombreColumna == "EQUIPO")//FJRF - Si alguna de las columnas tiene este nombre hacemos lo siguiente
            {
                e.Column.IsReadOnly = false;//FJRF - habilitamos las columnas para que no se pueda escribir sobre ella
            }
        }
        private void DtgEquipos_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
            string strNombreColumna = "";//FJRF - Variable para saber el nombre de la columna
            strNombreColumna = e.Column.Header.ToString();//FJRF - Extraemos el nombre de la columna

            e.Column.IsReadOnly = true;//FJRF - Inavilita las columnas para que no se pueda escribir sobre ella
            if (strNombreColumna == "ENTREGAS" || strNombreColumna == "PARES")//FJRF - Si alguna de las columnas tiene este nombre hacemos lo siguiente
            {
                Style MyStyleTextAlignmentProperty = new Style(typeof(DataGridCell));//FJRF - Creamos un nuevo estilo para la celda
                MyStyleTextAlignmentProperty.Setters.Add(new Setter(TextBlock.TextAlignmentProperty, TextAlignment.Right));//FJRF - Alineamos los datos de la celda a la derecha

                (e.Column as DataGridTextColumn).Binding.StringFormat = "{0:##,#0.##}";//FJRF - Enviamos el formato a la celda
                (e.Column as DataGridTextColumn).CellStyle = MyStyleTextAlignmentProperty;//FJRF - Asignamos el estilo creado
            }
        }
        private void DtgResumen_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
            string strNombreColumna = "";//FJRF - Variable para saber el nombre de la columna
            strNombreColumna = e.Column.Header.ToString();//FJRF - Extraemos el nombre de la columna

            e.Column.IsReadOnly = true;//FJRF - Inavilita las columnas para que no se pueda escribir sobre ella
            if (strNombreColumna == "PARES" || strNombreColumna == "CTG" || strNombreColumna == "PARESXCTG")//FJRF - Si alguna de las columnas tiene este nombre hacemos lo siguiente
            {
                Style MyStyleTextAlignmentProperty = new Style(typeof(DataGridCell));//FJRF - Creamos un nuevo estilo para la celda
                MyStyleTextAlignmentProperty.Setters.Add(new Setter(TextBlock.TextAlignmentProperty, TextAlignment.Right));//FJRF - Alineamos los datos de la celda a la derecha

                (e.Column as DataGridTextColumn).Binding.StringFormat = "{0:##,#0.##}";//FJRF - Enviamos el formato a la celda
                (e.Column as DataGridTextColumn).CellStyle = MyStyleTextAlignmentProperty;//FJRF - Asignamos el estilo creado
            }
        }
        private void BtnGuardar_Click(object sender, RoutedEventArgs e)
        {
            #region FJRF - Buscamos los parametros que vamos a enviar al sp
            Boolean BooHayDatosDeEntregas = false;//FJRF - Para saber si hay entregas con equipos asumimos por defecto que no

            String StrEquipoBuscado = "", StrIntegrantes = "";//FJRF - Para cargar los equipor que se estan buscando en este proceso
            String StrEntrega = "", StrEntregas = "";//FJRF - Para el manejo de las entregas
            for (int IntFilaActual = 0; IntFilaActual < DtEntregas.Rows.Count; IntFilaActual++)//FJRF - Recorremos la informacion encontrada
            {
                StrEntrega = DtEntregas.Rows[IntFilaActual][0].ToString();//FJRF - Extraemos la entrega
                StrEquipoBuscado = DtEntregas.Rows[IntFilaActual][3].ToString();//FJRF - Extraemos el codigo del equipo
                StrIntegrantes = DtEntregas.Rows[IntFilaActual][5].ToString();//FJRF - Extraemos los integrantes
                if (StrEquipoBuscado.Length == 5 && StrIntegrantes.Trim().Length > 0)//FJRF - Si el equipo tiene 5 caracteres y tiene integrantes (Por si han digitado un dato malo y se quedo en el grid ejemplo (12345)
                {
                    StrEntregas = StrEntregas + StrEquipoBuscado + StrEntrega + "-";//FJRF - Armamos las entregas
                    BooHayDatosDeEntregas = true;//FJRF - Informamos que si hay entregas
                }
            }
            String StrUsuarioQueGuarda = MDOgeneral.usuario;//FJRF - Asignamos el usuario
            String StrSemanaDigitada = TxtNumeroSemana.Text.Trim();//FJRF - Asignamos la semana
            #endregion

            #region FJRF - Validamos que los datos esten correctos
            Boolean BooDatosCorrectosParaGuardar = true;//FJRF - Asumimos que los datos ya estan correctos para guardar
            String StrParametroQueFaltaParaGuardar = "";//FJRF - Para informar que parametro falta para guardar los datos

            if (String.IsNullOrEmpty(StrSemanaDigitada) == true)//FJRF - Si la semana no tiene datos entonces hacemos lo siguiente
            {
                BooDatosCorrectosParaGuardar = false;//FJRF - Informamos al sistema que no se puede guardar
                StrParametroQueFaltaParaGuardar = "Falta que digite la semana para poder guardar los datos";//FJRF - Alistamos el mensaje que se va a enviar al usuario
            }
            if (BooHayDatosDeEntregas == false)//FJRF - Si no hay datos de entregas hacemos lo siguiente
            {
                BooDatosCorrectosParaGuardar = false;//FJRF - Informamos al sistema que no se puede guardar
                StrParametroQueFaltaParaGuardar = "No hay entregas con equipos asignados, asigne equipos a las entregas para poder guardar los datos";//FJRF - Alistamos el mensaje que se va a enviar al usuario
            }
            if (String.IsNullOrEmpty(StrUsuarioQueGuarda) == true)//FJRF - Si no hay un usuario hacemos lo siguiente (Se valida pero es posible que nunca entre aca)
            {
                BooDatosCorrectosParaGuardar = false;//FJRF - Informamos al sistema que no se puede guardar
                StrParametroQueFaltaParaGuardar = "Es posible que exista un error en el sistema no hay un usuario, informe al admnistrador del sistema";//FJRF - Alistamos el mensaje que se va a enviar al usuario
            }
            #endregion

            #region FJRF - Guardos los datos en el SP
            if (BooDatosCorrectosParaGuardar == true)//FJRF - Si los datos estan correctos para guardar hacemos lo siguiente
            {
                #region FJRF - ArmamosLaPregunta
                String StrCaptionBox = "CONFIRMACIÓN";
                String StrMensajeBox = "¿Esta segudo de guardar?";
                MessageBoxButton buttons = MessageBoxButton.YesNo;
                MessageBoxImage icon = MessageBoxImage.Question;
                #endregion

                if (MessageBox.Show(StrMensajeBox, StrCaptionBox, buttons, icon) == MessageBoxResult.Yes)//FJRF - Le preguntamos al usuario
                {
                    try//FJRF - Controlamos el error
                    {
                        Mouse.OverrideCursor = Cursors.Wait;//FJRF - Ponemos una esfera en timpo de espera

                        EjecutarSp_GRABARRESUMENMONDES(StrEntregas, StrSemanaDigitada, StrUsuarioQueGuarda);//FJRF - Guardamos los datos enviando los parametros solicitados

                        Mouse.OverrideCursor = Cursors.Arrow;//FJRF - Ponemos el cursor de forma normal nuevamente

                        Msgbox("PROCESO EXITOSO", "Información guardada con exito", MessageBoxButton.OK, MessageBoxImage.Information);//FJRF - Informamos la usuario
                    }
                    catch (Exception ex)//FJRF - Si se presenta algun error hacemos lo siguiente
                    {
                        MessageBox.Show(ex.Message, "PROCESO CANCELADO", MessageBoxButton.OK, MessageBoxImage.Error);//FJRF - Enviamos un mensaje al usuario
                        Mouse.OverrideCursor = Cursors.Arrow;//FJRF - Ponemos el cursor de forma normal nuevamente
                    }
                }
                else//FJRF - Si la respuesta es negativa
                {
                    MessageBox.Show("No se guardaron los datos", "PROCESO CANCELADO", MessageBoxButton.OK, MessageBoxImage.Stop);//FJRF - Enviamos un mensaje al usuario
                    Mouse.OverrideCursor = Cursors.Arrow;//FJRF - Ponemos el cursor de forma normal nuevamente
                }
            }
            else//FJRF - Si los datos no estan correctos para guardar hacemos lo siguiente
            {
                Msgbox("PROCESO CANCELADO", StrParametroQueFaltaParaGuardar, MessageBoxButton.OK, MessageBoxImage.Stop);//FJRF - Informamos la usuario
                Mouse.OverrideCursor = Cursors.Arrow;//FJRF - Ponemos el cursor de forma normal nuevamente
            }
            #endregion
        }
        private void BtnPregrabar_Click(object sender, RoutedEventArgs e)
        {
            #region FJRF - Buscamos los parametros que vamos a enviar al sp
            Boolean BooHayDatosDeEntregas = false;//FJRF - Para saber si hay entregas con equipos asumimos por defecto que no

            String StrEquipoBuscado = "", StrIntegrantes = "";//FJRF - Para cargar los equipor que se estan buscando en este proceso
            String StrEntrega = "", StrEntregas = "";//FJRF - Para el manejo de las entregas
            for (int IntFilaActual = 0; IntFilaActual < DtEntregas.Rows.Count; IntFilaActual++)//FJRF - Recorremos la informacion encontrada
            {
                StrEntrega = DtEntregas.Rows[IntFilaActual][0].ToString();//FJRF - Extraemos la entrega
                StrEquipoBuscado = DtEntregas.Rows[IntFilaActual][3].ToString();//FJRF - Extraemos el codigo del equipo
                StrIntegrantes = DtEntregas.Rows[IntFilaActual][5].ToString();//FJRF - Extraemos los integrantes
                if (StrEquipoBuscado.Length == 5 && StrIntegrantes.Trim().Length > 0)//FJRF - Si el equipo tiene 5 caracteres y tiene integrantes (Por si han digitado un dato malo y se quedo en el grid ejemplo (12345)
                {
                    StrEntregas = StrEntregas + StrEquipoBuscado + StrEntrega + "-";//FJRF - Armamos las entregas
                    BooHayDatosDeEntregas = true;//FJRF - Informamos que si hay entregas
                }
            }
            #endregion

            #region FJRF - Validamos que los datos esten correctos
            Boolean BooDatosCorrectosParaGuardar = true;//FJRF - Asumimos que los datos ya estan correctos para guardar
            String StrParametroQueFaltaParaGuardar = "";//FJRF - Para informar que parametro falta para guardar los datos

            if (BooHayDatosDeEntregas == false)//FJRF - Si no hay datos de entregas hacemos lo siguiente
            {
                BooDatosCorrectosParaGuardar = false;//FJRF - Informamos al sistema que no se puede guardar
                StrParametroQueFaltaParaGuardar = "No hay entregas con equipos asignados, asigne equipos a las entregas para poder pregrabar los datos";//FJRF - Alistamos el mensaje que se va a enviar al usuario
            }
            #endregion

            #region FJRF - Pregrabar los datos en el SP
            if (BooDatosCorrectosParaGuardar == true)//FJRF - Si los datos estan correctos para guardar hacemos lo siguiente
            {
                #region FJRF - ArmamosLaPregunta
                String StrCaptionBox = "CONFIRMACIÓN";
                String StrMensajeBox = "¿Esta segudo de pregrabar?";
                MessageBoxButton buttons = MessageBoxButton.YesNo;
                MessageBoxImage icon = MessageBoxImage.Question;
                #endregion

                if (MessageBox.Show(StrMensajeBox, StrCaptionBox, buttons, icon) == MessageBoxResult.Yes)//FJRF - Le preguntamos al usuario
                {
                    try//FJRF - Controlamos el error
                    {
                        Mouse.OverrideCursor = Cursors.Wait;//FJRF - Ponemos una esfera en timpo de espera

                        EjecutarSp_PREGRABARRESUMENMONDES(StrEntregas);//FJRF - Guardamos los datos enviando los parametros solicitados

                        Mouse.OverrideCursor = Cursors.Arrow;//FJRF - Ponemos el cursor de forma normal nuevamente

                        Msgbox("PROCESO EXITOSO", "Información pregrabada con exito", MessageBoxButton.OK, MessageBoxImage.Information);//FJRF - Informamos la usuario
                    }
                    catch (Exception ex)//FJRF - Si se presenta algun error hacemos lo siguiente
                    {
                        MessageBox.Show(ex.Message, "PROCESO CANCELADO", MessageBoxButton.OK, MessageBoxImage.Error);//FJRF - Enviamos un mensaje al usuario
                        Mouse.OverrideCursor = Cursors.Arrow;//FJRF - Ponemos el cursor de forma normal nuevamente
                    }
                }
                else//FJRF - Si la respuesta es negativa
                {
                    MessageBox.Show("No se guardaron los datos", "PROCESO CANCELADO", MessageBoxButton.OK, MessageBoxImage.Stop);//FJRF - Enviamos un mensaje al usuario
                    Mouse.OverrideCursor = Cursors.Arrow;//FJRF - Ponemos el cursor de forma normal nuevamente
                }
            }
            else//FJRF - Si los datos no estan correctos para guardar hacemos lo siguiente
            {
                Msgbox("PROCESO CANCELADO", StrParametroQueFaltaParaGuardar, MessageBoxButton.OK, MessageBoxImage.Stop);//FJRF - Informamos la usuario
                Mouse.OverrideCursor = Cursors.Arrow;//FJRF - Ponemos el cursor de forma normal nuevamente
            }
            #endregion
        }
        #endregion

        #region FJRF - Funciones y procedimientos

        protected void PttV_EjecutarSpYBuscarEntregas(String StrEquipoSeleccionado)
        {
            if (String.IsNullOrEmpty(StrEquipoSeleccionado) == true)//FJRF - Si el codigo no tiene datos hacemos lo siguiente
            {
                Msgbox("PROCESO CANCELADO", "El equipo no puede estar vacio", MessageBoxButton.OK, MessageBoxImage.Stop);//FJRF - Informamos la usuario
            }
            else//FJRF - Si el equipo tiene datos hacemos lo siguiente
            {
                String StrEntregasDelEquipo = "", StrEquipoEncontrado = "";//FJRF - Variables requeridas

                for (int IntFilaActual = 0; IntFilaActual < DtEntregas.Rows.Count; IntFilaActual++)//FJRF - Recorremos la informacion encontrada
                {
                    StrEquipoEncontrado = DtEntregas.Rows[IntFilaActual][3].ToString();//FJRF - Cargamos el equipo del grid
                    if (StrEquipoEncontrado == StrEquipoSeleccionado)//FJRF - Comparamos los datos y si son iguales hacemos lo siguiente
                    {
                        StrEntregasDelEquipo = StrEntregasDelEquipo + "" + DtEntregas.Rows[IntFilaActual][0].ToString() + "-";//FJRF - Extraemos el codigo del empleado
                    }
                }
                EjecutarSp_RESUMENMONDES(StrEquipoSeleccionado, StrEntregasDelEquipo);//FJRF - Cargamos el tercer grid
            }
        }
        private void EjecutarSp_RESUMENMONDES(string strEquipo, string strEntregas)//FJRF - Este procedimiento ejecuta un sp
        {
            try
            {
                #region FJRF - Ejecutamos el Sp principal
                MDOgeneral.spComando.CommandText = "SP_RESUMENMONDES";
                MDOgeneral.spComando.Connection = MDOgeneral.conexion;
                MDOgeneral.spComando.CommandType = CommandType.StoredProcedure;
                MDOgeneral.spComando.Parameters.Clear();

                //Input
                MDOgeneral.spComando.Parameters.Add("pva_codequ", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Value = strEquipo;
                MDOgeneral.spComando.Parameters.Add("pva_entregas", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Value = strEntregas;

                //Output salidas
                MDOgeneral.spComando.Parameters.Add("pva_result", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Direction = ParameterDirection.Output;
                MDOgeneral.spComando.Parameters.Add("pva_errusu", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Direction = ParameterDirection.Output;
                MDOgeneral.spComando.ExecuteNonQuery();
                #endregion

                #region FJRF - Buscamos los datos que retorna
                StrConsulta = "SELECT CODREF_TMP AS CODIGO, NOMREF_TMP AS REFERENCIA, CANPRO_TMP AS PARES, CTGREF_TMP AS CTG, PARCTG_TMP AS PARESXCTG FROM tmpresmondes ORDER BY NOMREF_TMP ";//FJRF - Armamos la consulta
                DtResumen = MdoGeneral.consulta(StrConsulta);//FJRF - Buscamos los datos
                DtgResumen.ItemsSource = DtResumen.DefaultView;//FJRF - Los asignamos al grid
                #endregion

            }
            catch (Exception ex) { throw ex; }
        }
        private void EjecutarSp_GRABARRESUMENMONDES(string strEntregas, string strSemana, string strCodigoUsuario)//FJRF - Este procedimiento ejecuta un sp
        {
            try
            {
                MDOgeneral.spComando.CommandText = "SP_GRABARRESUMENMONDES";
                MDOgeneral.spComando.Connection = MDOgeneral.conexion;
                MDOgeneral.spComando.CommandType = CommandType.StoredProcedure;
                MDOgeneral.spComando.Parameters.Clear();

                //Input
                MDOgeneral.spComando.Parameters.Add("pva_cadena", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Value = strEntregas;
                MDOgeneral.spComando.Parameters.Add("pnu_semana", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Value = strSemana;
                MDOgeneral.spComando.Parameters.Add("pva_codusu", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Value = strCodigoUsuario;

                //Output salidas
                MDOgeneral.spComando.Parameters.Add("pva_result", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Direction = ParameterDirection.Output;
                MDOgeneral.spComando.Parameters.Add("pva_errusu", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Direction = ParameterDirection.Output;
                MDOgeneral.spComando.ExecuteNonQuery();
            }
            catch (Exception ex) { throw ex; }
        }
        private void EjecutarSp_PREGRABARRESUMENMONDES(string strEntregas)//FJRF - Este procedimiento ejecuta un sp
        {
            try
            {
                MDOgeneral.spComando.CommandText = "SP_PREGRABARRESUMENMONDES";
                MDOgeneral.spComando.Connection = MDOgeneral.conexion;
                MDOgeneral.spComando.CommandType = CommandType.StoredProcedure;
                MDOgeneral.spComando.Parameters.Clear();

                //Input
                MDOgeneral.spComando.Parameters.Add("pva_cadena", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Value = strEntregas;

                //Output salidas
                MDOgeneral.spComando.Parameters.Add("pva_result", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Direction = ParameterDirection.Output;
                MDOgeneral.spComando.Parameters.Add("pva_errusu", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Direction = ParameterDirection.Output;
                MDOgeneral.spComando.ExecuteNonQuery();
            }
            catch (Exception ex) { throw ex; }
        }

        #region FJRF - CajaDeTextoMsgbox
        protected void Msgbox(String StrCaption, String StrMensaje, MessageBoxButton MsbTipoBoton, MessageBoxImage MsbTipoImagenIcono)
        {
            MessageBoxButton buttons;
            buttons = MsbTipoBoton;

            MessageBoxImage icon = MsbTipoImagenIcono;
            MessageBox.Show(StrMensaje, StrCaption, buttons, icon);
        }
        #endregion

        #region FJRF - ParaObtenerLasPropiedadesDeLaCeldaDelGrid
        //DataGridCell cell = DataGridHelper.GetCell(dgEst, dgEst.SelectedIndex, 0);//FJRF - Asi se llama
        static class DataGridHelper
        {
            static public DataGridCell GetCell(DataGrid dg, int row, int column)
            {
                DataGridRow rowContainer = GetRow(dg, row);

                if (rowContainer != null)
                {
                    DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(rowContainer);

                    // try to get the cell but it may possibly be virtualized
                    DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
                    if (cell == null)
                    {
                        // now try to bring into view and retreive the cell
                        dg.ScrollIntoView(rowContainer, dg.Columns[column]);
                        cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
                    }
                    return cell;
                }
                return null;
            }

            static public DataGridRow GetRow(DataGrid dg, int index)
            {
                DataGridRow row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromIndex(index);
                if (row == null)
                {
                    // may be virtualized, bring into view and try again
                    dg.ScrollIntoView(dg.Items[index]);
                    row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromIndex(index);
                }
                return row;
            }

            static T GetVisualChild<T>(Visual parent) where T : Visual
            {
                T child = default(T);
                int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
                for (int i = 0; i < numVisuals; i++)
                {
                    Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
                    child = v as T;
                    if (child == null)
                    {
                        child = GetVisualChild<T>(v);
                    }
                    if (child != null)
                    {
                        break;
                    }
                }
                return child;
            }
        }
        #endregion

        #region FJRF - ParaRetornarElValorDeUnaCeldaDeUnDataGrid
        private string ReturnDataGridCellText(DataGrid Dtg, object ObjItemFila, int IntColumna)
        {
            string strValorRetornado = "";//FJRF - Limpiamos el valor a retornar

            DataGridRow row = (DataGridRow)Dtg.ItemContainerGenerator.ContainerFromItem(ObjItemFila);//FJRF - Miramos cual es la fila a consultar

            if (row == null)
            {
                strValorRetornado = "";//FJRF - Retornamos el valor de la celda solo el texto
            }
            else
            {
                TextBlock cellContent = Dtg.Columns[IntColumna].GetCellContent(row) as TextBlock;//FJRF - Enviamos el dato de la fila y la columna para tener el dato de la celda

                if (cellContent == null)
                {
                    strValorRetornado = "";//FJRF - Retornamos el valor de la celda solo el texto
                }
                else
                {
                    strValorRetornado = cellContent.Text;//FJRF - Retornamos el valor de la celda solo el texto
                }
            }
            return strValorRetornado.Trim();//FJRF - Retornamos el valor sin espacion
        }
        #endregion

        #region FJRF - FuncionesEspecialesParaLasPropiedadesDeLaCeldaYElFoco

        public static T FindVisualChild<T>(DependencyObject obj) where T : DependencyObject
        {
            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
            {
                DependencyObject child = VisualTreeHelper.GetChild(obj, i);
                if (child != null && child is T)
                    return (T)child;
                else
                {
                    T childOfChild = FindVisualChild<T>(child);
                    if (childOfChild != null)
                        return childOfChild;
                }
            }
            return null;
        }
        public static DataGridCell GetCell(DataGrid dataGrid, DataGridRow rowContainer, int column)
        {
            if (rowContainer != null)
            {
                DataGridCellsPresenter presenter = FindVisualChild<DataGridCellsPresenter>(rowContainer);
                if (presenter == null)
                {
                    /* if the row has been virtualized away, call its ApplyTemplate() method 
                     * to build its visual tree in order for the DataGridCellsPresenter
                     * and the DataGridCells to be created */
                    rowContainer.ApplyTemplate();
                    presenter = FindVisualChild<DataGridCellsPresenter>(rowContainer);
                }
                if (presenter != null)
                {
                    DataGridCell cell = presenter.ItemContainerGenerator.ContainerFromIndex(column) as DataGridCell;
                    if (cell == null)
                    {
                        /* bring the column into view
                         * in case it has been virtualized away */
                        dataGrid.ScrollIntoView(rowContainer, dataGrid.Columns[column]);
                        cell = presenter.ItemContainerGenerator.ContainerFromIndex(column) as DataGridCell;
                    }
                    return cell;
                }
            }
            return null;
        }
        public static void SelectRowByIndexes(DataGrid dataGrid, params int[] rowIndexes)
        {
            if (!dataGrid.SelectionUnit.Equals(DataGridSelectionUnit.FullRow))
                throw new ArgumentException("The SelectionUnit of the DataGrid must be set to FullRow.");

            if (!dataGrid.SelectionMode.Equals(DataGridSelectionMode.Extended))
                throw new ArgumentException("The SelectionMode of the DataGrid must be set to Extended.");

            if (rowIndexes.Length.Equals(0) || rowIndexes.Length > dataGrid.Items.Count)
                throw new ArgumentException("Invalid number of indexes.");

            dataGrid.SelectedItems.Clear();
            foreach (int rowIndex in rowIndexes)
            {
                if (rowIndex < 0 || rowIndex > (dataGrid.Items.Count - 1))
                    throw new ArgumentException(string.Format("{0} is an invalid row index.", rowIndex));

                object item = dataGrid.Items[rowIndex]; //=Product X
                dataGrid.SelectedItems.Add(item);

                DataGridRow row = dataGrid.ItemContainerGenerator.ContainerFromIndex(rowIndex) as DataGridRow;
                if (row == null)
                {
                    dataGrid.ScrollIntoView(item);
                    row = dataGrid.ItemContainerGenerator.ContainerFromIndex(rowIndex) as DataGridRow;
                }
                if (row != null)
                {
                    DataGridCell cell = GetCell(dataGrid, row, 0);
                    if (cell != null)
                        cell.Focus();
                }
            }
        }
        public static void SelectCellByIndex(DataGrid dataGrid, int rowIndex, int columnIndex)
        {
            if (!dataGrid.SelectionUnit.Equals(DataGridSelectionUnit.Cell))
                throw new ArgumentException("The SelectionUnit of the DataGrid must be set to Cell.");

            if (rowIndex < 0 || rowIndex > (dataGrid.Items.Count - 1))
                throw new ArgumentException(string.Format("{0} is an invalid row index.", rowIndex));

            if (columnIndex < 0 || columnIndex > (dataGrid.Columns.Count - 1))
                throw new ArgumentException(string.Format("{0} is an invalid column index.", columnIndex));

            dataGrid.SelectedCells.Clear();

            object item = dataGrid.Items[rowIndex]; //=Product X
            DataGridRow row = dataGrid.ItemContainerGenerator.ContainerFromIndex(rowIndex) as DataGridRow;
            if (row == null)
            {
                dataGrid.ScrollIntoView(item);
                row = dataGrid.ItemContainerGenerator.ContainerFromIndex(rowIndex) as DataGridRow;
            }
            if (row != null)
            {
                DataGridCell cell = GetCell(dataGrid, row, columnIndex);
                if (cell != null)
                {
                    DataGridCellInfo dataGridCellInfo = new DataGridCellInfo(cell);
                    dataGrid.SelectedCells.Add(dataGridCellInfo);

                    cell.Focus();
                }
            }
        }
        #endregion

        #endregion


    }
}
